package Json2RDF.Surface2RDF.FaceManager;

import Json2RDF.Json2Java.OntologyClasses.Face;
import org.apache.jena.rdf.model.Resource;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * {@code PartFaceManager}类用于建立{@code Part}和{@code Face}之间的关联
 */
public class PartFaceManager {

  /**
   * 零件实例与对应表面实例列表的散列表，以零件的实例为key，该零件具有的表面实例列表作为value
   */
  private static final Map<Resource, List<Resource>> partFaces = new HashMap<>();

  /**
   * 将{@code face}添加到以{@code part}为key的value中
   *
   * @param part 输入零件RDF实例
   * @param face 输入表面RDF实例
   */
  private static void addFaceToPart(Resource part, Resource face) {
    partFaces.computeIfAbsent(part, k -> new ArrayList<>()).add(face);
  }

  /**
   * 遍历{@code faceMap}，读取每个{@code face}的{@code partId}信息，
   * 在{@code partMap}中根据Id找到对应的{@code part}，
   * 通过{@link PartFaceManager#addFaceToPart(Resource, Resource) addFaceToPart}添加到散列表中
   *
   * @param partMap 零件Id到RDF实例的索引表
   * @param faceMap 表面对象到RDF实例的索引表
   * @return {@code Map<Resource, List<Resource>> partFaces} 零件实例与对应表面实例列表的散列表
   */
  public static Map<Resource, List<Resource>> FacesToParts(Map<String, Resource> partMap, Map<Face, Resource> faceMap) {
    faceMap.forEach((k, v) -> addFaceToPart(partMap.get(k.getPartId()), v));
    return partFaces;
  }
}
